/*
Copyright (c) [2019年5月1日] [吴超]
[MBT_Studio] is licensed under Mulan PSL v2.
You can use this software according to the terms and conditions of the Mulan PSL v2.
You may obtain a copy of Mulan PSL v2 at:
		 http://license.coscl.org.cn/MulanPSL2
THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
See the Mulan PSL v2 for more details.
*/
#pragma once


#include "Context/当前默认操作数据.h"
#include "节点/节点树.h"
#include <UI/UI.h>




API_EXPORT void		f_node_环境初始化();
API_EXPORT void		f_node_环境销毁();
API_EXPORT void		f_node_初始化操作数据(S_Scene* scene, S_设备环境& 绘图环境);
API_EXPORT void		f_node_销毁操作数据();

uint64						f_node_创建LUA环境();
void						f_node_销毁LUA环境(uint64 ctx);
int32						f_node_执行lua脚本(uint64 ctx, std::string& code, bool 累积);
void						f_node_导入内部函数(uint64 ctx, const std::vector<std::string>& files);
std::vector<std::string>	f_node_代码提示补全(const std::string& input, const std::string& code);
std::vector<std::string>	f_node_代码提示补全(const std::string& input, const S_文档文本& doc, uint32 开始词数量);
std::vector<std::string>	f_node_成员代码补全(const std::string& input, const S_文档文本& doc, uint32 开始词数量);





API_EXPORT C_节点树*	f_node_get节点树(uint16 id);
API_EXPORT uint32		f_NT_get数量();

API_EXPORT C_节点树* f_node_get有全局变量的节点树(C_节点树* tree);
API_EXPORT void f_node_绑定子节点树全局变量(C_节点基类* node, C_节点基类* 全局变量节点, C_节点基类* 网格属性变量);
API_EXPORT void f_node_绑定子节点树全局变量(C_节点树* tree, C_节点基类* 全局变量节点, C_节点基类* 网格属性变量);

API_EXPORT void f_node_节点树添加节点(C_节点树* tree, C_节点基类* node);
API_EXPORT void f_node_节点树删除节点(C_节点树* tree, C_节点基类* node);
API_EXPORT void f_node_停止运行节点树();
API_EXPORT void f_node_准备帧更新节点();
API_EXPORT bool f_node_Step节点树();



API_EXPORT std::vector<C_节点基类*> f_node_深拷贝(C_节点基类** node, uint32 num, bool 节点树拷贝);

API_EXPORT C_节点树* f_NT_拷贝(C_节点树* 节点树);

API_EXPORT void f_node_添加暂停绘制部件(C_Widget* w);


API_EXPORT void f_node_加载节点(S_设备环境& ctx, std::vector<C_节点基类*>& m_Nodes, FILE* f);
API_EXPORT void f_node_保存节点(const std::set<C_节点基类*>& m_Nodes, FILE* f);

API_EXPORT C_节点基类* f_node_载入节点(S_设备环境& ctx, const std::string& 节点类型名称, FILE* f);
API_EXPORT void f_node_保存节点(C_节点基类* 节点, FILE* f);

API_EXPORT void f_node_载入全局节点(S_设备环境& ctx, FILE* f);
API_EXPORT void f_node_保存全局节点(FILE* f);

API_EXPORT std::vector<C_节点树*> f_node_加载节点树(S_设备环境& ctx, FILE* f);
API_EXPORT void                   f_node_保存节点树(std::vector<C_节点树*>& trees, FILE* f);


API_EXPORT void f_node后端_销毁所有节点树();

API_EXPORT void f_node后端_所有节点树设置为准备保存状态();
API_EXPORT void f_node后端_设置节点树读取新建状态();
API_EXPORT void f_node后端_读取所有节点(S_设备环境& ctx, FILE* f);
API_EXPORT void f_node后端_写出所有节点(FILE* f);

API_EXPORT void f_node后端_保存库节点(const std::set<C_节点基类*>& m_Nodes, FILE* f);
API_EXPORT void f_node后端_加载库节点(S_设备环境& ctx, std::vector<C_节点基类*>& Nodes, FILE* f);
API_EXPORT bool f_node后端_加载库节点信息(std::u16string info[2], FILE* f);
API_EXPORT bool f_node后端_覆盖保存库节点(std::string path, const std::set<C_节点基类*>& m_Nodes);

//API_EXPORT C_节点基类* f_node后端_创建扩展节点(S_设备环境& ctx, S_节点构建参数& 构建参数);

API_EXPORT void f_node_视口拾取空间射线坐标(const vec3& 开始, const vec3& 结束);
//void f_NT_设置节点名称(C_节点基类* 节点, std::wstring name);


API_EXPORT void f_NT_是否正在编译();


API_EXPORT void f_NT_清楚关联的程序集(C_节点树* tree);




